package tum0r.webengine.config

import tum0r.webengine.enums.EConfigType
import tum0r.webengine.extension.createDir
import tum0r.webengine.extension.isExistsFile
import java.io.File

/**
 * 说明: 日志文件配置
 *
 * 创建者: tum0r
 *
 * 时间: 2021/8/26 15:08
 */
class LogFileConfig private constructor() {
    /**
     * 日志文件配置伴生对象
     */
    companion object {
        /**
         * 日志输出类型数
         */
        const val LOG_FILE_COUNT = 3

        /**
         * 日志输出文件
         */
        val LOG_FILES = Array<File?>(LOG_FILE_COUNT) { null }

        /**
         * 旧日志输出文件
         */
        val OLD_LOG_FILES = Array<File?>(LOG_FILE_COUNT) { null }

        /**
         * 移动日志文件到旧日志文件
         *
         * @param[index] 下标
         * @param[type] 是否移动到旧日志文件配置项
         */
        fun move(index: Int, type: EConfigType) {
            if (!BaseConfig.isState(type)) return
            OLD_LOG_FILES[index]?.absoluteFile?.parentFile?.createDir()
            if (LOG_FILES[index] != null) if (LOG_FILES[index]!!.isExistsFile(true)) File(LOG_FILES[index]!!.absolutePath).renameTo(OLD_LOG_FILES[index])
        }

        /**
         * 打开新日志文件
         *
         * @param[index] 下标
         */
        fun newLog(index: Int, type: EConfigType) {
            if (!BaseConfig.isState(type)) return
            val file = LOG_FILES[index]
            if (file != null) {
                file.absoluteFile.parentFile.createDir()
                file.createNewFile()
            }
        }

        /**
         * 移动到旧日志文件和打开日志文件写入流
         */
        fun open() {
            // 如果原日志文件存在则删除
            for (i in 0 until LOG_FILE_COUNT)
                LOG_FILES[i]?.delete()
            // 创建新日志文件
            newLog(0, EConfigType.SAVE_INFO_LOG_TO_FILE)
            newLog(1, EConfigType.SAVE_DEBUG_LOG_TO_FILE)
            newLog(2, EConfigType.SAVE_ERROR_LOG_TO_FILE)
        }

        /**
         * 写入日志到日志文件中
         */
        fun logToFile(type: EConfigType, message: String) {
            val index = when (type) {
                EConfigType.SAVE_INFO_LOG_TO_FILE -> 0
                EConfigType.SAVE_DEBUG_LOG_TO_FILE -> 1
                EConfigType.SAVE_ERROR_LOG_TO_FILE -> 2
                else -> -1
            }
            if (index < 0 || !BaseConfig.isState(type)) return
            LOG_FILES[index]?.appendText("${message}${System.lineSeparator()}")
        }

        init {
            val logPath = "log${File.separator}new${File.separator}"
            LOG_FILES[0] = File("${logPath}info.log")
            LOG_FILES[1] = File("${logPath}debug.log")
            LOG_FILES[2] = File("${logPath}error.log")

            val oldLogPath = "log${File.separator}old${File.separator}"
            OLD_LOG_FILES[0] = File("${oldLogPath}info.log")
            OLD_LOG_FILES[1] = File("${oldLogPath}debug.log")
            OLD_LOG_FILES[2] = File("${oldLogPath}error.log")
        }
    }
}